package com.doctorliang.cheng.shopping.shoppintcar.utils;

import android.content.Context;
import android.text.TextUtils;
import android.util.SparseArray;

import com.doctorliang.cheng.shopping.app.MyApplication;
import com.doctorliang.cheng.shopping.home.bean.GoodsBean;
import com.doctorliang.cheng.shopping.utils.CacheUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by CHENG on 2017/9/30.
 * 购物车存储类
 */

public class CartStorage {
    public static final String JSON_CART = "json_cart";
    private static CartStorage instance;
    private final Context mcontext;
    //SparseArray代替HashMap存储数据，性能优一點
    private SparseArray<GoodsBean>sparseArray;

    /**
     * 得到购物车实例 单例模式
     * @return
     */
    public static CartStorage getInstance(){
        if (instance==null) {
            instance = new CartStorage(MyApplication.getContext());
        }
        return instance;
    }

    public CartStorage(Context context) {
        this.mcontext = context;
        //1.把之前存储的数据读取出来
        sparseArray = new SparseArray<>(100);
        //2.把存储的加入到上面的SparseArray(其中经历两次转换，1是保存到本地的String转list，2是list转SparseArray)
        list2SparseArray();
    }

    /**
     * 增加数据（就是添加到购物车）
     */
    public void addData(GoodsBean goodsBean){//因为可以添加多条相等的数据，所以要有一个int来记录
        //1添加到内存中SparseArray（如果当前数据已经存在，就修改number递增）
        //****先从内存拿到数据
        GoodsBean tempdata = sparseArray.get(Integer.parseInt(goodsBean.getProduct_id()));
        if (tempdata != null) {
            //不为空就是已存在了
            tempdata.setNumber(tempdata.getNumber() + 1);
        } else {
            tempdata = goodsBean;//把数据赋给tempdata
            tempdata.setNumber(1);
        }
        //同步到内存
        sparseArray.put(Integer.parseInt(tempdata.getProduct_id()),tempdata);

        //2同步保存到本地中（可以使sp，也可以是SD卡）
        save2Local();

    }

    /**
     * 删除某条数据
     * @param goodsBean
     */
    public void deleteData(GoodsBean goodsBean){
        //1从内存中删除（根据id删除）
        sparseArray.delete(Integer.parseInt(goodsBean.getProduct_id()));

        //2.把删除后的也保存到内存中（同步内存）
        save2Local();
    }

    /**
     * 更新某条数据
     * @param goodsBean
     */
    public void updataData(GoodsBean goodsBean){
        //1从内存中更新（根据id删除）
        sparseArray.put(Integer.parseInt(goodsBean.getProduct_id()),goodsBean);
        //2.把更新后的也保存到内存中（同步内存）
        save2Local();
    }

    /**
     * 保存数据到内存中
     */
    private void save2Local() {
        //经历3个步骤，1把sparseArray转成list，2是list转String,3保存
        //1sparseArray转成list
        List<GoodsBean>goodsBeanList = sparseArr2List();
        //2list转String(用gson)
        String json = new Gson().toJson(goodsBeanList);
        //3.save
        CacheUtils.setString(mcontext,JSON_CART,json);
    }

    private List<GoodsBean> sparseArr2List() {
        List<GoodsBean>goodsBeanList = new ArrayList<>();
        for (int i = 0;i<sparseArray.size();i++) {
            goodsBeanList.add(sparseArray.valueAt(i));
        }
        return  goodsBeanList;

    }


    /**
     * 从本地读取的数据加入到SparseArray中
     */
    private void list2SparseArray() {
        //本地保存的String转换成list
        List<GoodsBean> goodsBeanList = getAllData();
        //把list数据转换成SparseArray
        for (int i =0;i<goodsBeanList.size();i++) {
            GoodsBean goodsBean = goodsBeanList.get(i);
            sparseArray.put(Integer.parseInt(goodsBean.getProduct_id()),goodsBean);
        }
    }

    /**
     * 获取本地所有的数据（类型转换成了list集合）
     * @return
     */
    public List<GoodsBean> getAllData() {
        //1从本地获取
        String json = CacheUtils.getString(mcontext, JSON_CART);
        //2使用gson转换成list
        List<GoodsBean>goodsBeen = new ArrayList<>();
        if (!TextUtils.isEmpty(json)) {
            //把String转换成list
            goodsBeen = new Gson().fromJson(json,new TypeToken<List<GoodsBean>>(){}.getType());
        }

        return goodsBeen;
    }


}
